#ifndef __QE_GPIO_H__
#define __QE_GPIO_H__



#include "qe_device.h"



enum {
    QE_GPIO_INPUT = 0,
    QE_GPIO_OUTPUT
};

enum {
    QE_GPIO_LOW = 0,
    QE_GPIO_HIGH
};

enum {
    QE_GPIO_IOC_SHOW = 0x21,
    QE_GPIO_IOC_DUMP_REGISTERS,
    QE_GPIO_IOC_LIST_PINS,
};

struct qe_gpio_device;
typedef struct qe_gpio_device qe_gpio_dev;


typedef struct
{
    qe_ret (*direction_input)(qe_gpio_dev *dev, qe_uint pin);
    qe_ret (*direction_output)(qe_gpio_dev *dev, qe_uint pin, qe_int value);
    qe_int (*get_value)(qe_gpio_dev *dev, qe_uint pin);
    qe_ret (*set_value)(qe_gpio_dev *dev, qe_uint pin, qe_int value);
    void (*show)(qe_gpio_dev *dev);
    void (*dump_regs)(qe_gpio_dev *dev);
    void (*list_pins)(qe_gpio_dev *dev);
} qe_gpio_ops;

typedef struct qe_gpio_device 
{
    qe_dev parent;
    const qe_gpio_ops *ops;
    qe_list list;
} qe_gpio_dev;



qe_ret qe_gpio_direction_input(qe_gpio_dev *gpio, qe_uint pin);

qe_ret qe_gpio_direction_output(qe_gpio_dev *gpio, qe_uint pin, qe_int value);

qe_int qe_gpio_get_value(qe_gpio_dev *gpio, qe_uint pin);

qe_ret qe_gpio_register(qe_gpio_dev *gpio, qe_const_str name, 
    const qe_gpio_ops *ops, void *priv);

void qe_gpio_list_devices(void);



#endif /* __QE_GPIO_H__ */